package com.aop.additional_function;

import com.aop.bean.Person;
import com.aop.bean.Student;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author: tgy
 * @Date: 2020-08-07 11:38
 */
public class JDKProxy {

    /**
     *
     * AOP : 面向切面编程
     *
     *  切面  = 切入点(Point-Cut) + 附加功能
     *
     *      - 切入点
     *          对应指定的方法
     *      - 使用动态代理创建代理类
     *
     */
    public static void main(String[] args) {

        /**
         * 1. 真是类
         *
         * 2. 附加功能
         *
         * 3. 公共接口
         */
        Person person = new Student();

        Person proxyObj = (Person)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), person.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                System.out.println("before 1111111");
                Object result = method.invoke(person, args);
                System.out.println("after 1111111");
                return result;
            }
        });

        proxyObj.eat("1111");

    }
}
